iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 12
0

[GET] /api/groups
回傳值

{
  "data": {
    "groups": [
      {
        "id": 1,
        "name": "Math", // 群組名稱
        "tasks": [
          {
            "id": 11,
            "parent_id": 1,
            "name": "Part-1", // 任務名稱
            "created_timestamp": 1599058381
          }
        ]
      }
    ]
  },
  "result": true
}

Redis

因為群組、任務列表會很常用到,所以這邊多加一個快取,避免一直存取MySQL

/pkg/redis/redis.go

// Conn Conn
var Conn *redis.Client

// Init Init
func Init() {
	Conn = redis.NewClient(&redis.Options{
		Addr:     config.Val.RedisHost + ":" + config.Val.RedisPort,
		Password: config.Val.RedisPass,
		DB:       0,
	})

	_, err := Conn.Ping(context.Background()).Result()
	if err != nil {
		panic(err)
	}
}

群組跟任務有上下層關係,所以很常會跑到兩個迴圈,我盡可能的不超出這範圍
handler/api.go

func findGroups(userID string) (groups []*model.Task, err error) {
    // 優先用redis值
	val, err := redis.Conn.Get(context.Background(), redisGroupsKey(userID)).Bytes()
	if err == nil {
		if err = json.Unmarshal(val, &groups); err == nil {
			return
		}
	}

    // redis沒有再去讀DB
	groups, err = model.TaskModel.GetGroup(userID)
	if err != nil {
		return
	}

    // 把值都補到Redis
	groupsJSON, _ := json.Marshal(groups)
	redis.Conn.Set(context.Background(), redisGroupsKey(userID), groupsJSON, 24*3*time.Hour)

	return
}

func findTasks(userID string, parentID []int) (tasks []*model.Task, err error) {
	var data []*model.Task
	redisCache := false
	val, err := redis.Conn.Get(context.Background(), redisTasksKey(userID)).Bytes()
	if err == nil {
		if err = json.Unmarshal(val, &data); err == nil {
			redisCache = true
		}
	}

	if len(data) == 0 {
		data, err = model.TaskModel.GetTasks(userID, []int{model.TaskAble})
		if err != nil {
			return
		}
	}

	if !redisCache {
		tasksJSON, _ := json.Marshal(data)
		redis.Conn.Set(context.Background(), redisTasksKey(userID), tasksJSON, 24*3*time.Hour)
	}

	for _, t := range data {
		for _, pid := range parentID {
			if pid == t.ParentID {
				tasks = append(tasks, t)
				break
			}
		}
	}

	return
}

這支API就差不多完成了
來試打看看
https://ithelp.ithome.com.tw/upload/images/20200920/20129767f4uNYknkYD.png
今天的commit

謝謝大家~


上一篇
Day 11 新增任務API
下一篇
Day 13 修改、刪除任務&統計時間API
系列文
Golang & Vue.js 30天從0打造服務30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言